// permission.js

import router from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { getToken} from '@/utils/auth'
import getPageTitle from '@/utils/get-page-title'

// 进度条配置
NProgress.configure({
  showSpinner: false,  // 不显示加载动画
  minimum: 0.3,  // 最小进度
  trickleSpeed: 200  // 进度条加速速度
})

// 白名单配置
const WHITE_LIST = ['/login', '/callback']

// 重定向存储配置
export const RedirectStorage = {
  key: 'SSO_REDIRECT',  // 重定向的 key
  validity: 300000, // 延长至5分钟

  save(path) {
    // 如果路径不合法，则不存储
    if (!path || !path.startsWith('/')) {
      console.warn('[安全拦截] 非法存储路径:', path)
      return
    }
    const data = {
      path: encodeURI(path),  // 编码路径
      timestamp: Date.now()  // 记录当前时间戳
    }
    sessionStorage.setItem(this.key, JSON.stringify(data))
    console.log('[重定向存储] 存储路径:', path, ' 时间戳:', data.timestamp)
  },

  get() {
    const raw = sessionStorage.getItem(this.key)
    if (!raw) return null
    
    try {
      const { path, timestamp } = JSON.parse(raw)
      // 如果路径已过期，清除并返回 null
      if (Date.now() - timestamp > this.validity) {
        this.clear()
        console.log('[重定向存储] 存储已过期，已清除')
        return null
      }
      console.log('[重定向存储] 获取存储路径:', path)
      return decodeURI(path)  // 解码路径
    } catch (e) {
      this.clear()
      console.error('[重定向存储] 解析失败，已清除:', e)
      return null
    }
  },

  clear() {
    sessionStorage.removeItem(this.key)
    console.log('[重定向存储] 清除存储数据')
  }
}

// 路由守卫 - 全局前置守卫
router.beforeEach(async (to, from, next) => {
  // 添加路径日志
  console.log(`[路由守卫] 起始：从 ${from.path} 到 ${to.path}`)
  NProgress.start()  // 开始进度条

  // 设置页面标题
  document.title = getPageTitle(to.meta?.title)
  console.log('[路由守卫] 设置页面标题:', document.title)

  // 白名单处理
  if (WHITE_LIST.includes(to.path)) {
    console.log('[路由守卫] 目标路径在白名单中:', to.path)
    if (to.path === '/callback') {
      // 回调页面特殊处理
      console.log('[路由守卫] 处理回调页面')
      return next()
    }
    return nextWithDone()  // 直接放行
  }

  // 认证检查
  const token = getToken()
  console.log('[路由守卫][认证检查] Token状态:', token ? '存在' : '不存在')

  if (!token) {
    console.log('[路由守卫] 无Token,用户未认证，跳转到登录页面');
    // 如果没有token，处理未认证状态
    handleUnauthenticated(to)
    return nextWithDone()
  }

  // 已登录状态处理
  if (to.path === '/login') {
    console.log('[路由守卫] 已登录，跳转到主页')
    return nextWithDone('/')  // 如果是登录页面，跳转到主页
  }

  try {
    
    // 用户信息加载
    if (!store.getters.userInfo) {
      console.log('[路由守卫] 用户信息未加载，开始加载')
      await store.dispatch('user/getInfo')
    }
    
    next()  // 放行
  } catch (error) {
    console.error('[路由守卫] 认证异常:', error)
    // 认证失败，清除token并跳转到登录页面
    await store.dispatch('user/resetToken')
    Message.error(error.message || '身份验证失败')
    
    const redirect = to.path === '/' ? null : `?redirect=${encodeURIComponent(to.fullPath)}`
    next(`/login${redirect || ''}`)
  }

  // 放行
  function nextWithDone(path) {
    path ? next(path) : next()
  }

  // 未认证用户处理
  function handleUnauthenticated(target) {
    if (target.path !== '/login') {
      // 保存重定向路径
      RedirectStorage.save(target.fullPath)
    }
    next('/login')  // 跳转到登录页面
  }
})

// 路由守卫 - 全局后置钩子
router.afterEach(() => {
  NProgress.done()  // 结束进度条
})

// 如果其他文件需要导入 router
export default router